#include <iostream>
#include <pthread.h>
#include <cstring>
#include <unistd.h>
#include <thread>


__thread int value=10;


std::string tohex(pthread_t tid)
{
    char buff[64];
    snprintf(buff,sizeof(buff),"0x%lx",tid);
    return buff;
}

void* start(void* args)
{
    pthread_detach(pthread_self());
    std::string str=static_cast<const char*>(args);//这是 C++ 提供的显式类型转换操作符，会在编译时进行类型检查
    while(true)
    {
        std::cout<<"我是一个新线程,value:"<<value<<",tid:"<<tohex(pthread_self())<<std::endl;
        sleep(1);
        //break;
    }

    return (void*)10;
    //pthread_exit((void*)123);
}




int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,start,(void*)"thread 1");

    // sleep(3);
    // pthread_cancel(tid);
    // //std::cout<<"取消线程："<<tid<<std::endl;
    // printf("取消线程:0x%lx\n",tid);
    // sleep(3);

    // void* ret=nullptr;
    // int n=pthread_join(tid,&ret);
    // std::cout<<"新线程退出码为："<<(long long)ret<<",n:"<<n<<std::endl;


    while(true)
    {
        std::cout<<"我是主线程,value:"<<value<<",tid:"<<tohex(pthread_self())<<std::endl;
        sleep(1);
        value+=1;
        if(value==10)
        {
            ::pthread_join(tid,nullptr);
        }
    }
    return 0;
}









// int gvalue=100;

// class ThreadData
// {
// public:
//     ThreadData(const std::string& name,int a,int b):_name(name),_a(a),_b(b)
//     {

//     }
//     int Excute()
//     {
//         return _a+_b;
//     }
//     std::string Name()
//     {
//         return _name;
//     }
//     ~ThreadData()
//     {

//     }

// private:
//     std::string _name;
//     int _a;
//     int _b;
//     int _c;
// };

// std::string tohex(pthread_t tid)
// {
//     char buff[64];
//     snprintf(buff,sizeof(buff),"0x%lx",tid);
//     return buff;
// }

// void* routine(void* args)
// {
//     std::string str=static_cast<const char*>(args);//这是 C++ 提供的显式类型转换操作符，会在编译时进行类型检查
//     while(true)
//     {
//         std::cout<<"I am new thread,my name is: "<< str 
//                 <<",my thread is:"<<tohex(pthread_self())
//                 <<",全局变量 gvalue is:"<<gvalue<<std::endl;
//         //printf("my thread id :0x%lx\n",pthread_self());//机器为64位，加上lx
//         gvalue++;
//         sleep(1);
//         break;
//     }
//     return 0;
// }
// void* routine2(void* args)
// {
//     ThreadData* td=static_cast<ThreadData*>(args);//这是 C++ 提供的显式类型转换操作符，会在编译时进行类型检查
//     while(true)
//     {
//         std::cout<<"I am new thread,my name is: "<< td->Name()
//                 <<",my thread is:"<<tohex(pthread_self())
//                 <<",全局变量(只检查) gvalue is:"<<gvalue<<std::endl;
//         //printf("my thread id :0x%lx\n",pthread_self());//机器为64位，加上lx
//         //gvalue++;
//         // int* p=nullptr;
//         // *P=10;
//         std::cout<<"the result is:"<<td->Excute()<<std::endl;
//         sleep(1);
//         break;
//     }
//     return (void*)123;
// }
// int main()
// {
//     // std::thread t([](){
//     //     while(true)
//     //     {
//     //         std::cout<<"I am new thread,my name is: thread 2"<< str <<std::endl;
//     //         sleep(1);
//     //     }
//     // });


//     pthread_t tid1;

//     ThreadData* td1=new ThreadData("thread 1",100,200);
//     pthread_create(&tid1,nullptr,routine2,td1);

//     void* ret=nullptr;

//     int n=pthread_join(tid1,&ret);//等待tid1，退出结果不关心设置为空
//     if(n!=0)//等待失败
//     {
//         std::cout<<"join error:"<<strerror(n)<<std::endl;
//         return -1;
//     }
//     std::cout<<"join success,ret is:"<<(long long)ret<<std::endl;
//     // pthread_t tid2;
//     // pthread_create(&tid2,nullptr,routine2,(void*)"thread 2");
//     // pthread_t tid3;
//     // pthread_create(&tid3,nullptr,routine,(void*)"thread 3");
//     // pthread_t tid4;
//     // pthread_create(&tid4,nullptr,routine,(void*)"thread 4");
//     // pthread_t tid5;
//     // pthread_create(&tid5,nullptr,routine,(void*)"thread 5");


//     while(true)
//     {
//         std::cout<<"I am main "<<std::endl;
//         sleep(1);
//     }
//     // if(n!=0)//创建失败
//     // {
//     //     std::cout<<"create thread error:"<<strerror(n)<<std::endl;
//     //     return -1;
//     // }
//     //sleep(2);
//     //std::cout<<"new thread id:"<<tid<<std::endl;
//     //printf("new thread id :0x%lx\n",tid);//机器为64位，加上lx
//     return 0;
// }